#ifndef _VL_SHARED_MEMORY__H_
#define _VL_SHARED_MEMORY__H_

#include <memory>

#if defined __unix || defined __unix__ || __linux__ || __APPLE__ || defined __MACH__
	#define VL_POSIX
#else
	#error Unsupport platform...
#endif

namespace VL {

/**
 * @Author: CimZzz
 * @Date: 2022-08-17 15:14:24
 * 
 * 共享内存对象
 */
class SharedMemory {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 11:02:20
	 * 
	 * 构造方法
	 * 
	 * @param key 值指针
	 * @param memoryCapacity 内存尺寸
	 * @param numsOfSem 信号量数量
	 */
	explicit SharedMemory(std::shared_ptr<void> keyPtr, size_t memoryCapacity, bool notCreate = false);
	
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 11:02:37
	 * 
	 * 析构函数
	 */
	~SharedMemory();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 15:56:49
	 * 
	 * 初始化共享内存
	 * 
	 * @return 如果初始化成功返回 true
	 */
	bool initSharedMemory();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 17:25:42
	 * 
	 * 标记为创建共享内存
	 */
	void markNeedCreate();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 15:18:56
	 * 
	 * 标记为不创建共享内存
	 */
	void markNotCreate();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 15:59:29
	 * 
	 * 关联共享内存
	 * 
	 * @return 关联成功返回 true
	 * 
	 * @note 只有关联成功才可以调用 [getSharedMemory] 获取共享内存地址
	 */
	bool attach();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 16:01:35
	 * 
	 * 获取共享内存地址
	 * 
	 * @return 共享内存地址
	 */
	void* getSharedMemory();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 15:59:50
	 * 
	 * 分离共享内存
	 * 
	 * @return 分离成功返回 true
	 */
	bool detach();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 16:06:42
	 * 
	 * 释放共享内存
	 * 
	 * @return 释放成功返回 true
	 */
	bool release();

#ifdef VL_POSIX

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 11:48:55
	 * 
	 * 生成共享内存 Key 值
	 * 
	 * @param path 项目路径
	 * @param id 项目编号
	 * 
	 * @return 共享内存 Key 值
	 */
	static std::shared_ptr<void> generateKey(const char * path, int id);

#endif //VL_POSIX

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 16:19:23
	 * 
	 * 判断是否已经完成初始化
	 */
	bool isInited;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 16:19:34
	 * 
	 * 判断是否已经 Attach 上共享内存
	 */
	bool isAttached;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 16:22:22
	 * 
	 * 是否自动释放信号量
	 */
	bool notCreate;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 11:34:43
	 * 
	 * 内存尺寸
	 */
	size_t memoryCapacity;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 11:01:43
	 * 
	 * 共享内存 Key 值
	 */
	std::shared_ptr<void> key;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 11:02:57
	 * 
	 * 共享内存 id
	 */
	std::shared_ptr<void> shmId;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-08-17 16:26:27
	 * 
	 * 共享内存地址
	 */
	void* sharedMemory;

};

}

#endif // _VL_SHARED_MEMORY__H_
